

//以下是一个简单的 LED 驱动程序示例，使用 sysfs 接口来控制 LED 的开关。
// led_driver.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/kobject.h>

#define LED_GPIO_PIN 17 // 根据实际连接的 GPIO 引脚号进行修改

static struct kobject *led_kobj;
static int led_state = 0; // 0: 关, 1: 开

// sysfs 文件的显示函数
static ssize_t led_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) {
    return sprintf(buf, "%d\n", led_state);
}

// sysfs 文件的存储函数
static ssize_t led_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) {
    if (buf[0] == '1') {
        gpio_set_value(LED_GPIO_PIN, 1); // 打开 LED
        led_state = 1;
    } else {
        gpio_set_value(LED_GPIO_PIN, 0); // 关闭 LED
        led_state = 0;
    }
    return count;
}

// 定义 sysfs 属性
static struct kobj_attribute led_attribute = __ATTR(led, 0664, led_show, led_store);

static int __init led_init(void) {
    // 请求 GPIO 引脚
    if (!gpio_is_valid(LED_GPIO_PIN)) {
        printk(KERN_ALERT "Invalid GPIO pin\n");
        return -1;
    }

    gpio_request(LED_GPIO_PIN, "LED_GPIO");
    gpio_direction_output(LED_GPIO_PIN, 0); // 默认关闭 LED

    // 创建 sysfs 目录
    led_kobj = kobject_create_and_add("led_control", kernel_kobj);
    if (!led_kobj) {
        return -ENOMEM;
    }

    // 创建 sysfs 文件
    if (sysfs_create_file(led_kobj, &led_attribute.attr)) {
        kobject_put(led_kobj);
        return -ENOMEM;
    }

    printk(KERN_INFO "LED driver initialized\n");
    return 0;
}

static void __exit led_exit(void) {
    gpio_set_value(LED_GPIO_PIN, 0); // 关闭 LED
    gpio_free(LED_GPIO_PIN); // 释放 GPIO 引脚
    kobject_put(led_kobj); // 删除 sysfs 目录
    printk(KERN_INFO "LED driver exited\n");
}

module_init(led_init);
module_exit(led_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple LED driver using sysfs");

/*
make
sudo insmod led_driver.ko

echo 1 > /sys/kernel/led_control/led
echo 0 > /sys/kernel/led_control/led

sudo rmmod led_driver

*/
